//
// Created by 29245 on 2025/8/25.
//

#include "delay.h"
#include "stm32f1xx_hal.h"

/**
 * @brief  初始化DWT计数器用于微秒延迟
 * @note   利用CPU周期计数器实现高精度延时
 */
void delay_init(void) {
    // 使能DWT外设
    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    // 清除计数器
    DWT->CYCCNT = 0;
    // 使能计数器
    DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
}

/**
 * @brief  微秒级延迟函数
 * @param  us: 延迟时间(0~233015us@72MHz)
 */
void delay_us(uint32_t us) {
    uint32_t start = DWT->CYCCNT;
    uint32_t cycles = us * (SystemCoreClock / 1000000);
    // 等待计数器达到目标值
    while ((DWT->CYCCNT - start) < cycles);
}

/**
 * @brief  毫秒级延迟函数
 * @param  ms: 延迟时间(0~4294967ms)
 */
void delay_ms(uint32_t ms) {
    // 基于delay_us实现，确保一致性
    for (uint32_t i = 0; i < ms; i++) {
        delay_us(1000);
    }
}
